package com.controller;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.Car;
import com.entity.Orders;
import com.entity.view.CarView;
import com.service.CarService;
import com.service.OrdersService;
import com.service.StoreupService;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.UserBasedCollaborativeFiltering;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Date;
import java.util.List;
@RestController
@RequestMapping("/Car")
public class CarController {



        /**
         * 汽车信息
         * 后端接口
         * @author
         * @email
         * @date 2023-12-12 13:37:41
         */

        @Autowired
        private CarService carService;

        @Autowired
        private StoreupService storeupService;

        @Autowired
        private OrdersService ordersService;

        /**
         * 后端列表
         */
        @RequestMapping("/page")
        public R page(@RequestParam Map<String, Object> params, Car car,
                      @RequestParam(required = false) Double pricestart,
                      @RequestParam(required = false) Double priceend,
                      HttpServletRequest request) {
            String tableName = request.getSession().getAttribute("tableName").toString();
            if (tableName.equals("t_merchant")) {
                car.setMerchantId((Integer) request.getSession().getAttribute("id"));
            }
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            if (pricestart != null) ew.ge("price", pricestart);
            if (priceend != null) ew.le("price", priceend);

            PageUtils page = carService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, car), params), params));

            return R.ok().put("data", page);
        }

        /**
         * 前端列表
         */
        @IgnoreAuth
        @RequestMapping("/list")
        public R list(@RequestParam Map<String, Object> params, Car car,
                      @RequestParam(required = false) Double pricestart,
                      @RequestParam(required = false) Double priceend,
                      HttpServletRequest request) {
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            if (pricestart != null) ew.ge("price", pricestart);
            if (priceend != null) ew.le("price", priceend);

            PageUtils page = carService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, car), params), params));
            return R.ok().put("data", page);
        }

        /**
         * 列表
         */
        @RequestMapping("/lists")
        public R list(Car car) {
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            ew.allEq(MPUtil.allEQMapPre(car, "car"));
            return R.ok().put("data", carService.selectListView(ew));
        }

        /**
         * 查询
         */
        @RequestMapping("/query")
        public R query(Car car) {
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            ew.allEq(MPUtil.allEQMapPre(car, "car"));
            CarView carView = carService.selectView(ew);
            return R.ok("查询汽车信息成功").put("data", carView);
        }

        /**
         * 后端详情
         */
        @RequestMapping("/info/{id}")
        public R info(@PathVariable("id") Integer id) {
            Car car = carService.selectById(id);
            car.setClickCount(car.getClickCount() + 1);
            carService.updateById(car);
            return R.ok().put("data", car);
        }

        /**
         * 前端详情
         */
        @IgnoreAuth
        @RequestMapping("/detail/{id}")
        public R detail(@PathVariable("id") Integer id) {
            Car car = carService.selectById(id);
            car.setClickCount(car.getClickCount() + 1);
            carService.updateById(car);
            return R.ok().put("data", car);
        }

        /**
         * 后端保存
         */
        @RequestMapping("/save")
        public R save(@RequestBody Car car, HttpServletRequest request) {
            // ValidatorUtils.validateEntity(car);
            carService.insert(car);
            return R.ok();
        }

        /**
         * 前端保存
         */
        @RequestMapping("/add")
        public R add(@RequestBody Car car, HttpServletRequest request) {
            // ValidatorUtils.validateEntity(car);
            carService.insert(car);
            return R.ok();
        }

        /**
         * 修改
         */
        @RequestMapping("/update")
        @Transactional
        public R update(@RequestBody Car car, HttpServletRequest request) {
            // ValidatorUtils.validateEntity(car);
            carService.updateById(car);// 全部更新
            return R.ok();
        }

        /**
         * 删除
         */
        @RequestMapping("/delete")
        public R delete(@RequestBody Long[] ids) {
            carService.deleteBatchIds(Arrays.asList(ids));
            return R.ok();
        }

        /**
         * 前端智能排序
         */
        @IgnoreAuth
        @RequestMapping("/autoSort")
        public R autoSort(@RequestParam Map<String, Object> params, Car car, HttpServletRequest request, String pre) {
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            Map<String, Object> newMap = new HashMap<String, Object>();
            Map<String, Object> param = new HashMap<String, Object>();
            Iterator<Map.Entry<String, Object>> it = param.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, Object> entry = it.next();
                String key = entry.getKey();
                String newKey = entry.getKey();
                if (pre.endsWith(".")) {
                    newMap.put(pre + newKey, entry.getValue());
                } else if (StringUtils.isEmpty(pre)) {
                    newMap.put(newKey, entry.getValue());
                } else {
                    newMap.put(pre + "." + newKey, entry.getValue());
                }
            }
            params.put("sort", "clicknum");
            params.put("order", "desc");
            PageUtils page = carService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, car), params), params));
            return R.ok().put("data", page);
        }

        /**
         * 协同算法（基于用户的协同算法）
         */
        @RequestMapping("/autoSort2")
        public R autoSort2(@RequestParam Map<String, Object> params, Car car, HttpServletRequest request) {
            String userId = request.getSession().getAttribute("userId").toString();
            Integer limit = params.get("limit") == null ? 10 : Integer.parseInt(params.get("limit").toString());
            List<Orders> orders = ordersService.selectList(new EntityWrapper<Orders>());
            Map<String, Map<String, Double>> ratings = new HashMap<>();
            if (orders != null && orders.size() > 0) {
                for (Orders o : orders) {
                    Map<String, Double> userRatings = null;
                    if (ratings.containsKey(o.getUserId().toString())) {
                        userRatings = ratings.get(o.getUserId().toString());
                    } else {
                        userRatings = new HashMap<>();
                        ratings.put(o.getUserId().toString(), userRatings);
                    }
                    if (userRatings.containsKey(o.getProductId().toString())) {
                        userRatings.put(o.getProductId().toString(), userRatings.get(o.getProductId().toString()) + 1.0);
                    } else {
                        userRatings.put(o.getProductId().toString(), 1.0);
                    }
                }
            }
            // 创建协同过滤对象
            UserBasedCollaborativeFiltering filter = new UserBasedCollaborativeFiltering(ratings);

            // 为指定用户推荐物品
            String targetUser = userId;
            int numRecommendations = limit;
            List<String> recommendations = filter.recommendItems(targetUser, numRecommendations);

            // 输出推荐结果
            System.out.println("Recommendations for " + targetUser + ":");
            for (String item : recommendations) {
                System.out.println(item);
            }

            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            ew.in("id", recommendations);
            if (recommendations != null && recommendations.size() > 0) {
                ew.last("order by FIELD(id, " + String.join(",", recommendations) + ")");
            }

            PageUtils page = carService.queryPage(params, ew);
            List<Car> pageList = (List<Car>) page.getList();
            if (pageList.size() < limit) {
                int toAddNum = limit - pageList.size();
                ew = new EntityWrapper<Car>();
                ew.notIn("id", recommendations);
                ew.orderBy("id", false);
                ew.last("limit " + toAddNum);
                pageList.addAll(carService.selectList(ew));
            } else if (pageList.size() > limit) {
                pageList = pageList.subList(0, limit);
            }
            page.setList(pageList);

            return R.ok().put("data", page);
        }

        /**
         * （按值统计）
         */
        @RequestMapping("/value/{xColumnName}/{yColumnName}")
        public R value(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, HttpServletRequest request) {
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("xColumn", xColumnName);
            params.put("yColumn", yColumnName);
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            String tableName = request.getSession().getAttribute("tableName").toString();
            if (tableName.equals("t_merchant")) {
                ew.eq("merchant_code", (String) request.getSession().getAttribute("username"));
            }
            List<Map<String, Object>> result = carService.selectValue(params, ew);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for (Map<String, Object> m : result) {
                for (String k : m.keySet()) {
                    if (m.get(k) instanceof Date) {
                        m.put(k, sdf.format((Date) m.get(k)));
                    }
                }
            }
            return R.ok().put("data", result);
        }

        /**
         * （按值统计(多)）
         */
        @RequestMapping("/valueMul/{xColumnName}")
        public R valueMul(@PathVariable("xColumnName") String xColumnName, @RequestParam String yColumnNameMul, HttpServletRequest request) {
            String[] yColumnNames = yColumnNameMul.split(",");
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("xColumn", xColumnName);
            List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String, Object>>>();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            String tableName = request.getSession().getAttribute("tableName").toString();
            if (tableName.equals("t_merchant")) {
                ew.eq("merchant_code", (String) request.getSession().getAttribute("username"));
            }
            for (int i = 0; i < yColumnNames.length; i++) {
                params.put("yColumn", yColumnNames[i]);
                List<Map<String, Object>> result = carService.selectValue(params, ew);
                for (Map<String, Object> m : result) {
                    for (String k : m.keySet()) {
                        if (m.get(k) instanceof Date) {
                            m.put(k, sdf.format((Date) m.get(k)));
                        }
                    }
                }
                result2.add(result);
            }
            return R.ok().put("data", result2);
        }

        /**
         * （按值统计）时间统计类型
         */
        @RequestMapping("/value/{xColumnName}/{yColumnName}/{timeStatType}")
        public R valueDay(@PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType, HttpServletRequest request) {
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("xColumn", xColumnName);
            params.put("yColumn", yColumnName);
            params.put("timeStatType", timeStatType);
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            String tableName = request.getSession().getAttribute("tableName").toString();
            if (tableName.equals("t_merchant")) {
                ew.eq("merchant_code", (String) request.getSession().getAttribute("username"));
            }
            List<Map<String, Object>> result = carService.selectTimeStatValue(params, ew);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for (Map<String, Object> m : result) {
                for (String k : m.keySet()) {
                    if (m.get(k) instanceof Date) {
                        m.put(k, sdf.format((Date) m.get(k)));
                    }
                }
            }
            return R.ok().put("data", result);
        }

        /**
         * （按值统计）时间统计类型(多)
         */
        @RequestMapping("/valueMul/{xColumnName}/{timeStatType}")
        public R valueMulDay(@PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType, @RequestParam String yColumnNameMul, HttpServletRequest request) {
            String[] yColumnNames = yColumnNameMul.split(",");
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("xColumn", xColumnName);
            params.put("timeStatType", timeStatType);
            List<List<Map<String, Object>>> result2 = new ArrayList<List<Map<String, Object>>>();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            String tableName = request.getSession().getAttribute("tableName").toString();
            if (tableName.equals("t_merchant")) {
                ew.eq("merchant_code", (String) request.getSession().getAttribute("username"));
            }
            for (int i = 0; i < yColumnNames.length; i++) {
                params.put("yColumn", yColumnNames[i]);
                List<Map<String, Object>> result = carService.selectTimeStatValue(params, ew);
                for (Map<String, Object> m : result) {
                    for (String k : m.keySet()) {
                        if (m.get(k) instanceof Date) {
                            m.put(k, sdf.format((Date) m.get(k)));
                        }
                    }
                }
                result2.add(result);
            }
            return R.ok().put("data", result2);
        }

        /**
         * 分组统计
         */
        @RequestMapping("/group/{columnName}")
        public R group(@PathVariable("columnName") String columnName, HttpServletRequest request) {
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("column", columnName);
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            String tableName = request.getSession().getAttribute("tableName").toString();
            if (tableName.equals("t_merchant")) {
                ew.eq("merchant_code", (String) request.getSession().getAttribute("username"));
            }
            List<Map<String, Object>> result = carService.selectGroup(params, ew);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            for (Map<String, Object> m : result) {
                for (String k : m.keySet()) {
                    if (m.get(k) instanceof Date) {
                        m.put(k, sdf.format((Date) m.get(k)));
                    }
                }
            }
            return R.ok().put("data", result);
        }

        /**
         * 总数量
         */
        @RequestMapping("/count")
        public R count(@RequestParam Map<String, Object> params, Car car, HttpServletRequest request) {
            String tableName = request.getSession().getAttribute("tableName").toString();
            if (tableName.equals("t_merchant")) {
                car.setMerchantId((Integer) request.getSession().getAttribute("merchantId"));
            }
            EntityWrapper<Car> ew = new EntityWrapper<Car>();
            int count = carService.selectCount(MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, car), params), params));
            return R.ok().put("data", count);
        }




}
